<?php
    
class Usuario {
	private $idUsuario;
	private $email;
	private $tipoCadastro;
	private $dataCadastro;
	private $ultimoAcesso;
	private $nome;
	private $foto;
	private $dataNascimento;
	private $sexo;
	private $cidade;
	private $estado;
	private $instituicao;
	private	$alunoNivel;
	private	$alunoCurso;
	private	$alunoPeriodo;
	private	$professorAutorizado;
	private	$professorInstituto;
	private	$professorDepartamento;
	private	$professorTitulacao;
	private	$professorEnderecoInstitucional;
	private	$professorTelefoneInstitucional;
	private	$professorCursosPretendidos;
	private	$cursos	=	array();
	
	/**
	 * @constructor
	 * @classDescription Classe modelo que representa um usuario do Sistema
	 * @param int[optional]    		$idUsuario
	 */
	public function Usuario($idUsuario) {
		if ($conexao		=	BancoDados::conectaBancoDados()){
			$strQuery		=	"SELECT * FROM usuarios WHERE idUsuario=" . $idUsuario . ";";
			$resultado		=	BancoDados::query($strQuery);
			
			if(!empty($resultado)) {
				$dadosUsuario 	=	$resultado[0];
				$this->setIdUsuario($dadosUsuario['idUsuario']);
				$this->setEmail($dadosUsuario['email']);
				$this->setTipoCadastro($dadosUsuario['tipoCadastro']);
				$this->setDataCadastro($dadosUsuario['dataCadastro']);
				$this->setUltimoAcesso($dadosUsuario['ultimoAcesso']);
				$this->setNome($dadosUsuario['nome']);
				$this->setFoto($dadosUsuario['foto']);
				$this->setDataNascimento($dadosUsuario['dataNascimento']);
				$this->setSexo($dadosUsuario['sexo']);
				$this->setCidade($dadosUsuario['cidade']);
				$this->setEstado($dadosUsuario['estado']);
				$this->setInstituicao($dadosUsuario['instituicao']);
				
				if ($this->getTipoCadastro() == 'aluno') {
					$strQuery		=	"SELECT * FROM dadosAlunos WHERE idUsuario=" . $idUsuario . ";";
					$resultado		=	BancoDados::query($strQuery);
					
					$dadosUsuario 	=	$resultado[0];
					
					$this->setAlunoNivel($dadosUsuario['nivel']);
					$this->setAlunoCurso($dadosUsuario['curso']);
					$this->setAlunoPeriodo($dadosUsuario['periodo']);
				}
				
				if ($this->getTipoCadastro() == 'professor' || $this->getTipoCadastro() == 'administrador') {
					$strQuery		=	"SELECT * FROM dadosProfessores WHERE idUsuario=" . $idUsuario . ";";
					$resultado		=	BancoDados::query($strQuery);
					
					$dadosUsuario 	=	$resultado[0];
					
					$this->setProfessorAutorizado($dadosUsuario['autorizado']);
					$this->setProfessorInstituto($dadosUsuario['instituto']);
					$this->setProfessorDepartamento($dadosUsuario['departamento']);
					$this->setProfessorTitulacao($dadosUsuario['titulacao']);
					$this->setProfessorEnderecoInstitucional($dadosUsuario['enderecoInstitucional']);
					$this->setProfessorTelefoneInstitucional($dadosUsuario['telefoneInstitucional']);
					$this->setProfessorCursosPretendidos($dadosUsuario['cursosPretendidos']);
				}
				
				$strQuery	=	"SELECT cursos.idCurso, cursos.idDono, cursos.nome as nomeCurso, cursos.logo as logoCurso, cursos.inicioCurso, cursos.terminoCurso, cursos.liberado FROM usuariosTurmas, turmas, cursos WHERE usuariosTurmas.idUsuario = " . $idUsuario . " AND usuariosTurmas.idTurma = turmas.idTurma AND turmas.idCurso = cursos.idCurso AND cursos.apagado = 0 GROUP BY idCurso ORDER BY nomeCurso;";
				$resultado	= BancoDados::query($strQuery);
				
				if (is_array($resultado)) {
					foreach ($resultado as $dadosCurso) {
						$strQuery	=	"SELECT turmas.idTurma, turmas.nome as nomeTurma, usuariosTurmas.funcaoUsuario, usuariosTurmas.ultimoAcesso, usuariosTurmas.autorizado FROM usuariosTurmas, turmas WHERE turmas.idCurso = " . $dadosCurso['idCurso'] . " AND usuariosTurmas.idTurma = turmas.idTurma AND usuariosTurmas.idUsuario = " . $idUsuario . " ORDER BY nomeTurma;";
						$resultadoTurma	= BancoDados::query($strQuery);
						$this->adicionaCurso($dadosCurso['idCurso'], $dadosCurso['nomeCurso'], $dadosCurso['idDono'], $dadosCurso['logoCurso'], $dadosCurso['inicioCurso'], $dadosCurso['terminoCurso'], $dadosCurso['liberado'], $resultadoTurma);
					}
				}
			}
			else {
				$this->setIdUsuario(null);
			}
		}
	}
    
    /**
     * Returns $alunoCurso.
     *
     * @see Usuario::$alunoCurso
     */
    public function getAlunoCurso() {
        return $this->alunoCurso;
    }
    
    /**
     * Sets $alunoCurso.
     *
     * @param object $alunoCurso
     * @see Usuario::$alunoCurso
     */
    public function setAlunoCurso($alunoCurso) {
        $this->alunoCurso = $alunoCurso;
    }
    
    /**
     * Returns $alunoNivel.
     *
     * @see Usuario::$alunoNivel
     */
    public function getAlunoNivel() {
        return $this->alunoNivel;
    }
    
    /**
     * Sets $alunoNivel.
     *
     * @param object $alunoNivel
     * @see Usuario::$alunoNivel
     */
    public function setAlunoNivel($alunoNivel) {
        $this->alunoNivel = $alunoNivel;
    }
    
    /**
     * Returns $alunoPeriodo.
     *
     * @see Usuario::$alunoPeriodo
     */
    public function getAlunoPeriodo() {
        return $this->alunoPeriodo;
    }
    
    /**
     * Sets $alunoPeriodo.
     *
     * @param object $alunoPeriodo
     * @see Usuario::$alunoPeriodo
     */
    public function setAlunoPeriodo($alunoPeriodo) {
        $this->alunoPeriodo = $alunoPeriodo;
    }
    
    /**
     * Returns $cidade.
     *
     * @see Usuario::$cidade
     */
    public function getCidade() {
        return $this->cidade;
    }
    
    /**
     * Sets $cidade.
     *
     * @param object $cidade
     * @see Usuario::$cidade
     */
    public function setCidade($cidade) {
        $this->cidade = $cidade;
    }
    
    /**
     * Returns $dataCadastro.
     *
     * @see Usuario::$dataCadastro
     */
    public function getDataCadastro() {
        return $this->dataCadastro;
    }
    
    /**
     * Sets $dataCadastro.
     *
     * @param object $dataCadastro
     * @see Usuario::$dataCadastro
     */
    public function setDataCadastro($dataCadastro) {
        $this->dataCadastro = $dataCadastro;
    }
    
    /**
     * Returns $dataNascimento.
     *
     * @see Usuario::$dataNascimento
     */
    public function getDataNascimento() {
        return $this->dataNascimento;
    }
    
    /**
     * Sets $dataNascimento.
     *
     * @param object $dataNascimento
     * @see Usuario::$dataNascimento
     */
    public function setDataNascimento($dataNascimento) {
        $this->dataNascimento = $dataNascimento;
    }
    
    /**
     * Returns $email.
     *
     * @see Usuario::$email
     */
    public function getEmail() {
        return $this->email;
    }
    
    /**
     * Sets $email.
     *
     * @param object $email
     * @see Usuario::$email
     */
    public function setEmail($email) {
        $this->email = $email;
    }
    
    /**
     * Returns $estado.
     *
     * @see Usuario::$estado
     */
    public function getEstado() {
        return $this->estado;
    }
    
    /**
     * Sets $estado.
     *
     * @param object $estado
     * @see Usuario::$estado
     */
    public function setEstado($estado) {
        $this->estado = $estado;
    }
    
    /**
     * Returns $foto.
     *
     * @see Usuario::$foto
     */
    public function getFoto() {
        return $this->foto;
    }
    
    /**
     * Sets $foto.
     *
     * @param object $foto
     * @see Usuario::$foto
     */
    public function setFoto($foto) {
        $this->foto = $foto;
    }
    
    /**
     * Returns $idUsuario.
     *
     * @see Usuario::$idUsuario
     */
    public function getIdUsuario() {
        return $this->idUsuario;
    }
    
    /**
     * Sets $idUsuario.
     *
     * @param object $idUsuario
     * @see Usuario::$idUsuario
     */
    public function setIdUsuario($idUsuario) {
        $this->idUsuario = $idUsuario;
    }
    
    /**
     * Returns $instituicao.
     *
     * @see Usuario::$instituicao
     */
    public function getInstituicao() {
        return $this->instituicao;
    }
    
    /**
     * Sets $instituicao.
     *
     * @param object $instituicao
     * @see Usuario::$instituicao
     */
    public function setInstituicao($instituicao) {
        $this->instituicao = $instituicao;
    }
    
    /**
     * Returns $nome.
     *
     * @see Usuario::$nome
     */
    public function getNome() {
        return $this->nome;
    }
    
    /**
     * Sets $nome.
     *
     * @param object $nome
     * @see Usuario::$nome
     */
    public function setNome($nome) {
        $this->nome = $nome;
    }
    
    /**
     * Returns $professorAutorizado.
     *
     * @see Usuario::$professorAutorizado
     */
    public function getProfessorAutorizado() {
        return $this->professorAutorizado;
    }
    
    /**
     * Sets $professorAutorizado.
     *
     * @param object $professorAutorizado
     * @see Usuario::$professorAutorizado
     */
    public function setProfessorAutorizado($professorAutorizado) {
        $this->professorAutorizado = $professorAutorizado;
    }
    
    /**
     * Returns $professorCursosPretendidos.
     *
     * @see Usuario::$professorCursosPretendidos
     */
    public function getProfessorCursosPretendidos() {
        return $this->professorCursosPretendidos;
    }
    
    /**
     * Sets $professorCursosPretendidos.
     *
     * @param object $professorCursosPretendidos
     * @see Usuario::$professorCursosPretendidos
     */
    public function setProfessorCursosPretendidos($professorCursosPretendidos) {
        $this->professorCursosPretendidos = $professorCursosPretendidos;
    }
    
    /**
     * Returns $professorDepartamento.
     *
     * @see Usuario::$professorDepartamento
     */
    public function getProfessorDepartamento() {
        return $this->professorDepartamento;
    }
    
    /**
     * Sets $professorDepartamento.
     *
     * @param object $professorDepartamento
     * @see Usuario::$professorDepartamento
     */
    public function setProfessorDepartamento($professorDepartamento) {
        $this->professorDepartamento = $professorDepartamento;
    }
    
    /**
     * Returns $professorEnderecoInstitucional.
     *
     * @see Usuario::$professorEnderecoInstitucional
     */
    public function getProfessorEnderecoInstitucional() {
        return $this->professorEnderecoInstitucional;
    }
    
    /**
     * Sets $professorEnderecoInstitucional.
     *
     * @param object $professorEnderecoInstitucional
     * @see Usuario::$professorEnderecoInstitucional
     */
    public function setProfessorEnderecoInstitucional($professorEnderecoInstitucional) {
        $this->professorEnderecoInstitucional = $professorEnderecoInstitucional;
    }
    
    /**
     * Returns $professorInstituto.
     *
     * @see Usuario::$professorInstituto
     */
    public function getProfessorInstituto() {
        return $this->professorInstituto;
    }
    
    /**
     * Sets $professorInstituto.
     *
     * @param object $professorInstituto
     * @see Usuario::$professorInstituto
     */
    public function setProfessorInstituto($professorInstituto) {
        $this->professorInstituto = $professorInstituto;
    }
    
    /**
     * Returns $professorTelefoneInstitucional.
     *
     * @see Usuario::$professorTelefoneInstitucional
     */
    public function getProfessorTelefoneInstitucional() {
        return $this->professorTelefoneInstitucional;
    }
    
    /**
     * Sets $professorTelefoneInstitucional.
     *
     * @param object $professorTelefoneInstitucional
     * @see Usuario::$professorTelefoneInstitucional
     */
    public function setProfessorTelefoneInstitucional($professorTelefoneInstitucional) {
        $this->professorTelefoneInstitucional = $professorTelefoneInstitucional;
    }
    
    /**
     * Returns $professorTitulacao.
     *
     * @see Usuario::$professorTitulacao
     */
    public function getProfessorTitulacao() {
        return $this->professorTitulacao;
    }
    
    /**
     * Sets $professorTitulacao.
     *
     * @param object $professorTitulacao
     * @see Usuario::$professorTitulacao
     */
    public function setProfessorTitulacao($professorTitulacao) {
        $this->professorTitulacao = $professorTitulacao;
    }
    
    /**
     * Returns $sexo.
     *
     * @see Usuario::$sexo
     */
    public function getSexo() {
        return $this->sexo;
    }
    
    /**
     * Sets $sexo.
     *
     * @param object $sexo
     * @see Usuario::$sexo
     */
    public function setSexo($sexo) {
        $this->sexo = $sexo;
    }
    
    /**
     * Returns $tipoCadastro.
     *
     * @see Usuario::$tipoCadastro
     */
    public function getTipoCadastro() {
        return $this->tipoCadastro;
    }
    
    /**
     * Sets $tipoCadastro.
     *
     * @param object $tipoCadastro
     * @see Usuario::$tipoCadastro
     */
    public function setTipoCadastro($tipoCadastro) {
        $this->tipoCadastro = $tipoCadastro;
    }
    
    /**
     * Returns $ultimoAcesso.
     *
     * @see Usuario::$ultimoAcesso
     */
    public function getUltimoAcesso() {
        return $this->ultimoAcesso;
    }
    
    /**
     * Sets $ultimoAcesso.
     *
     * @param object $ultimoAcesso
     * @see Usuario::$ultimoAcesso
     */
    public function setUltimoAcesso($ultimoAcesso) {
        $this->ultimoAcesso = $ultimoAcesso;
    }
    
	
	/**
     * Returns $cursos.
     * @see Usuario::$cursos
     */
    public function getCursos()
    {
        return $this->cursos;
    }

    /**
     * Sets $cursos.
     * @param object $cursos
     * @see Usuario::$cursos
     */
    public function setCursos($cursos)
    {
        $this->cursos = $cursos;
    }
    
    /**
     * Adiciona um curso do usuario atual.
     * @return 
     * @param object $idCurso
     * @param object $idTurma
     * @param object $nomeTurma
     * @param object $funcaoUsuario
     * @param object $ultimoAcesso
     * @param object $autorizado
     * @param object $dataInscricao
     * @param object $idTutor
     * @param object $inicioCurso
     * @param object $terminoCurso
     * @param object $liberado
     * @param object $apagado
     */
    public function adicionaCurso($idCurso, $nomeCurso, $idDono, $logoCurso, $inicioCurso, $terminoCurso, $liberado, $turmas)
    {
        $this->cursos[$idCurso] 	=	array(	'nome' => $nomeCurso,
												'idDono' => $idDono,
												'logoCurso' => $logoCurso,
												'inicioCurso' => $inicioCurso,
												'terminoCurso' => $terminoCurso,
												'liberado' => $liberado,
												'turmas' => $turmas,);
    }	
	
	/**
	 * Verifica se os dados inseridos pelo usuario no formulario de cadastro sao validos.
	 * @return bool
	 * @param string $strNome
	 * @param string $strFoto
	 * @param file	 $arquivoFoto
	 * @param int    $intDataNascimentoDia
	 * @param int    $intDataNascimentoMes
	 * @param int    $intDataNascimentoAno
	 * @param string $strSexo
	 * @param string $strEndereco
	 * @param string $strCidade
	 * @param string $strEstado
	 * @param int    $intTelefone
	 * @param string $strCurso
	 * @param string $strInstituicao
	 * @param string $strEmail
	 * @param string $strConfirmaEmail
	 * @param string $strSenha
	 * @param string $strConfirmaSenha
	 * @param bool   $cadastroProfessor
	 * @param string $strTitulacao
	 * @param string $strInstituto
	 * @param string $strDepartamento
	 * @param string $strDisplinasMinistradas
	 * @param string $strCursosPretendidos
	 */
	public static function validaUsuario($novoUsuario, $strEmail, $strConfirmaEmail, $strSenha, $strConfirmaSenha, $tipoCadastro, $strNome, $arquivoFoto, $intDataNascimento, $strSexo, $strCidade, $strEstado, $strInstituicao, $strNivel, $strCurso, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao, $strEnderecoInstitucional, $intTelefoneInstitucional, $strDisciplinasPretendidas, $termoCompromisso){
		$validou	=	true;
		/*
		 * Validacao do nome inserido pelo usuario.
		 */
		
		if (!validaAlfabetico($strNome, __TAM_NOME_USUARIO__)){
			$validou	=	false;
			$_SESSION['constructore']['mensagens']['erroNome']	=	'Preencha corretamente o campo <span class="negrito">Nome</span>.';	
		}
		
		/*
		 * Validacao da data de nascimento inserida pelo usuario.
		 */
		
		if (!validaDataString($intDataNascimento) && str_replace('-', '', $intDataNascimento) !=''){
			$validou			=	false;
			$_SESSION['constructore']['mensagens']['erroDataNascimento']	=	'Preencha corretamente o campo <span class="negrito">Data de Nascimento</span>.';	
		}
		
		/*
		 * Validacao do Sexo inserido pelo usuario.
		 */
		
		if($strSexo	==	''){
			$validou			=	false;
			$_SESSION['constructore']['mensagens']['erroSexo']	=	'É necessário preencher o campo <span class="negrito">Sexo</span>.';
		}
		
		/*
		 * Validacao da Cidade inserida pelo usuario.
		 */
		
		if (!validaAlfabetico($strCidade, __TAM_CIDADE_USUARIO__)){
			$validou			=	false;
			$_SESSION['constructore']['mensagens']['erroCidade']	=	'Preencha corretamente o campo <span class="negrito">Cidade</span>.';	
		}
		
		/*
		 * Validacao do Estado inserido pelo usuario.
		 */
		
		if ($strEstado == '--' ){
			$validou			=	false;
			$strMensagemErro	=	'Selecione um <span class="negrito">Estado</span>.';
			$_SESSION['constructore']['mensagens']['erroEstado']	=	$strMensagemErro;	
		}
		
		if ($tipoCadastro != 'aluno' && $tipoCadastro != 'professor') {
			$validou 		=	false;
			$strMensagem	=	'Selecione a sua <span class="negrito">Finalidade de Uso da Constructore</span>';
			$_SESSION['constructore']['mensagens']['erroTipoCadastro']	=	$strMensagem;
		}
		else {
			if ($tipoCadastro == 'aluno') {
				/*
				 * Validacao da Instituicao inserida pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strInstituicao, __TAM_INSTITUICAO_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Instituição</span>.';
					$_SESSION['constructore']['mensagens']['erroInstituicao']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Nivel do Curso inserido pelo usuario.
				 */
				if ($strNivel == '--') {
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o <span class="negrito">Nível do Curso</span>.';
					$_SESSION['constructore']['mensagens']['erroInstituicao']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Curso inserido pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strCurso, __TAM_CURSO_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o <span class="negrito">Nome do Curso</span>.';
					$_SESSION['constructore']['mensagens']['erroCurso']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Periodo inserido pelo usuario.
				 */
				
				if ($intPeriodo == '--'){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o <span class="negrito">Período do Curso</span>.';
					$_SESSION['constructore']['mensagens']['erroCurso']	=	$strMensagemErro;	
				}
			}
			
			if ($tipoCadastro == 'professor') {
				/*
				 * Validacao da Instituicao inserida pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strInstituicao, __TAM_INSTITUICAO_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Instituição</span>.';
					$_SESSION['constructore']['mensagens']['erroInstituicao']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Instituto inserida pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strInstituto, __TAM_INSTITUTO_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Instituto</span>.';
					$_SESSION['constructore']['mensagens']['erroInstituto']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Departamento inserido pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strDepartamento, __TAM_DEPARTAMENTO_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Departamento</span>.';
					$_SESSION['constructore']['mensagens']['erroDepartamento']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao da Titulacao inserida pelo usuario.
				 */
				
				if ($strTitulacao == '--'){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Maior Titulação</span>.';
					$_SESSION['constructore']['mensagens']['erroTitulacao']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Endereco Institucional inserido pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strEnderecoInstitucional, __TAM_ENDERECO_INSTITUCIONAL_USUARIO__) && $strEnderecoInstitucional	!=	''){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Endereço Institucional</span>.';
					$_SESSION['constructore']['mensagens']['erroEnderecoInstitucional']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao do Telefone Institucional inserido pelo usuario.
				 */
				
				if (!validaNumero($intTelefoneInstitucional, __TAM_TELEFONE_INSTITUCIONAL_USUARIO__) && $intTelefoneInstitucional	!=	''){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Telefone Institucional</span>.';
					$_SESSION['constructore']['mensagens']['erroTelefoneInstitucional']	=	$strMensagemErro;	
				}
				
				/*
				 * Validacao das Disciplinas Pretendidas inseridas pelo usuario.
				 */
				
				if (!validaAlfaNumerico($strDisciplinasPretendidas, __TAM_DISCIPLINAS_PRETENDIDAS_USUARIO__)){
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Disciplinas Pretendidas</span>.';
					$_SESSION['constructore']['mensagens']['erroDisciplinasPretendidas']	=	$strMensagemErro;	
				}
			}
		}
		
		/*
		 * Validacao do Email inserido pelo usuario.
		 */
		
		if (!validaEmail($strEmail)){
			$validou			=	false;
			$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Email</span>.';
			$_SESSION['constructore']['mensagens']['erroEmail']	=	$strMensagemErro;	
		}
		else{
			if ($novoUsuario) {
				$strQuery	=	"SELECT email FROM usuarios WHERE email='" . $strEmail . "'";
				if($resultSet	=	BancoDados::query($strQuery)){
					$emailExistente	=	false;
					
					foreach ($resultSet as $resultado) {
						if (!empty($resultado)) {
							$emailExistente 	=	true;
						}
					}
					if ($emailExistente){
						$validou			=	false;
						$strMensagemErro	=	'Email já cadastrado. <a href="' . escreveLink(array('lembrarsenha')) .'">Esqueceu sua senha?</a>';
						$_SESSION['constructore']['mensagens']['erroEmail']	=	$strMensagemErro;
					}
				}
			}
		}
		
		/*
		 * Validacao do ConfirmaEmail inserido pelo usuario.
		 */
		
		if ($strEmail	!=	$strConfirmaEmail){
			$validou			=	false;
			$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Confimação de Email</span>.';
			$_SESSION['constructore']['mensagens']['erroConfirmaEmail']	=	$strMensagemErro;	
		}
		
		/*
		 * Validacao da Senha inserida pelo usuario.
		 */
		if (!validaSenha($strSenha)){
			if (!$novoUsuario) {
				if ($strSenha != '') {
					$validou			=	false;
					$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Senha</span>.';
					$_SESSION['constructore']['mensagens']['erroSenha']	=	$strMensagemErro;
				}
			}
			else {
				$validou			=	false;
				$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Senha</span>.';
				$_SESSION['constructore']['mensagens']['erroSenha']	=	$strMensagemErro;
			}
		}
		
		/*
		 * Validacao do ConfirmaEmail inserido pelo usuario.
		 */
		
		if ($strSenha	!=	$strConfirmaSenha){
			$validou			=	false;
			$strMensagemErro	=	'Preencha corretamente o campo <span class="negrito">Confimação de Senha</span>.';
			$_SESSION['constructore']['mensagens']['erroConfirmaSenha']	=	$strMensagemErro;	
		}
		
		if ($termoCompromisso == false && ($tipoCadastro == 'aluno' || $tipoCadastro == 'professor')) {
			$validou 		=	false;
			$strMensagem	=	'Você deve concordar com o <span class="negrito">Termo de Compromisso</span> de Usuários da Constructore.';
			$_SESSION['constructore']['mensagens']['erroTermoCompromisso']	=	$strMensagem;
		}
		
		/*
		 * Validacao da foto inserida pelo usuario.
		 */
		
		if (!validaFoto($arquivoFoto['name']) && $arquivoFoto['name'] !=''){
			$validou			=	false;
			$_SESSION['constructore']['mensagens']['erroFoto']	=	'É necessário escolher uma <span class="negrito">Foto</span> no formato gif, jpg, jpeg, png ou bmp.';
		}
		else{
			if ($arquivoFoto != null){
				if ($arquivoFoto['size']/1024	>	__TAM_FOTO_USUARIO__){
					$validou			=	false;
					$_SESSION['constructore']['mensagens']['erroFoto']	=	'O tamanho máximo para upload de <span class="negrito">Foto</span> é de 1MB.';	
				}
				else{
					/*
					 * Verifica se a foto validou, mas houve algum outro erro de validacao.
					 * Seta uma mensagem pedindo ao usuario que reenvie a foto, pois a mesma nao e salva se houver um erro.
					 */
					if(!$validou){
						$strMensagemErro	=	'Você deve fazer upload de sua  <span class="negrito">Foto</span> novamente.';
						$_SESSION['constructore']['mensagens']['erroFoto']	=	$strMensagemErro;	
					}
				}
			}
		}
		
		return $validou;
	}
	
	/**
	 * Salva no Banco de dados as informacoes inseridas pelo usuario.
	 * @return bool
	 * @param string $strNome
	 * @param string $strFoto
	 * @param file	 $arquivoFoto
	 * @param int    $intDataNascimentoDia
	 * @param int    $intDataNascimentoMes
	 * @param int    $intDataNascimentoAno
	 * @param string $strSexo
	 * @param string $strEndereco
	 * @param string $strCidade
	 * @param string $strEstado
	 * @param int    $intTelefone
	 * @param string $strCurso
	 * @param string $strInstituicao
	 * @param string $strEmail
	 * @param string $strConfirmaEmail
	 * @param string $strSenha
	 * @param string $strConfirmaSenha
	 * @param bool   $cadastroProfessor
	 * @param string $strTitulacao
	 * @param string $strInstituto
	 * @param string $strDepartamento
	 * @param string $strDisplinasMinistradas
	 * @param string $strCursosPretendidos
	 */
	public static function salvarNovoUsuario($strEmail, $strConfirmaEmail, $strSenha, $strConfirmaSenha, $tipoCadastro, $strNome, $arquivoFoto, $intDataNascimento, $strSexo, $strCidade, $strEstado, $strInstituicao, $strNivel, $strCurso, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao, $strEnderecoInstitucional, $intTelefoneInstitucional, $strDisciplinasPretendidas, $termoCompromisso) {
		if (Usuario::validaUsuario(true, $strEmail, $strConfirmaEmail, $strSenha, $strConfirmaSenha, $tipoCadastro, $strNome, $arquivoFoto, $intDataNascimento, $strSexo, $strCidade, $strEstado, $strInstituicao, $strNivel, $strCurso, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao, $strEnderecoInstitucional, $intTelefoneInstitucional, $strDisciplinasPretendidas, $termoCompromisso)) {
			
			if ($intDataNascimento == '--') {
				$intDataNascimento 	=	'NULL';
			}
			else {
				$intDataNascimento 	=	"'" . $intDataNascimento . "'";
			}
			
			$strQuery	=	"INSERT INTO usuarios VALUES (default, '". $strEmail . "', MD5('" . $strSenha . "'), '" . $tipoCadastro . "', NOW(), NOW(), '" . $strNome . "', NULL, " . $intDataNascimento . ", '" . $strSexo . "', '" . $strCidade . "', '" . $strEstado . "', '" . $strInstituicao . "');";
			
			/*
			 * Salvando o Usuário no Banco de Dados.
			 */
			if(!BancoDados::query($strQuery)) return false;
			
			/*
			 * Pegando o id do usuario inserido.
			 */
			
			$strQuery	=	"SELECT idUsuario FROM usuarios WHERE email='" . $strEmail . "';";
			
			/*
			 * Se nao consegue pegar o id do usuario, apaga o usuario do banco
			 */
			if (!$resultado = BancoDados::query($strQuery)) {
				$strQuery 	=	"DELETE FROM usuarios WHERE email='" . $strEmail . "';";
				return false;
			}
			
			$idUsuario 	=	$resultado[0]['idUsuario'];
			$moveuFoto 	=	true;
			
			/*
			 * Salvando a foto do usuario, caso exista.
			 */
			
			if ($arquivoFoto){
				$extensao		=	array_pop(explode('.', $arquivoFoto['name']));
				$nomeFoto 		=	'usuario' . $idUsuario . '.' . $extensao;
				$caminhoFoto	=	__CAMINHO_FOTO_USUARIO__ . $nomeFoto;
				
				if (move_uploaded_file($arquivoFoto['tmp_name'], $caminhoFoto)){
					$strQuery	=	"UPDATE usuarios SET foto='" . $nomeFoto . "' WHERE idUsuario=" . $idUsuario . ";"; 
					if(!BancoDados::query($strQuery)){
						$moveuFoto 	=	false;
					}
				}
				else{
					$moveuFoto 	=	 false;
				}
			}
			
			switch ($tipoCadastro) {
				case 'aluno':
					$strQuery	=	"INSERT INTO dadosAlunos VALUES(" . $idUsuario . ", '" . $strNivel . "', '" . $strCurso . "', " . $intPeriodo . ");";
					$strMensagemSucesso	=	"Seu cadastro foi realizado com sucesso.";
					break;
				case 'professor':
					$strQuery	=	"INSERT INTO dadosProfessores VALUES(" . $idUsuario . ", 0, '" . $strInstituto . "', '" . $strDepartamento . "', '" . $strTitulacao . "', '" . $strEnderecoInstitucional . "', '" . $intTelefoneInstitucional . "', '" . $strDisciplinasPretendidas . "');";
					$strMensagemSucesso	=	"Seu cadastro foi realizado com sucesso.";
					break;
			}
			
			if (!BancoDados::query($strQuery)) {
				$strQuery 	=	"DELETE FROM usuarios WHERE idUsuario=" . $idUsuario . ";";
				return false;
			}
			
			if (!$moveuFoto) {
				$_SESSION['constructore']['mensagens']['erroMoverFoto']	=	"Houve um erro ao salvar sua foto no Banco de Dados, por favor, tente novamente após efetuar login.";
			}
			
			$_SESSION['constructore']['mensagens']['sucessoCadastro']	=	$strMensagemSucesso;
			
			return true;
		}
		else {
			return	false;
		}
	}
	
	public function alterarUsuario ($strEmail, $strConfirmaEmail, $strSenha, $strConfirmaSenha, $tipoCadastro, $strNome, $arquivoFoto, $intDataNascimento, $strSexo, $strCidade, $strEstado, $strInstituicao, $strNivel, $strCurso, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao, $strEnderecoInstitucional, $intTelefoneInstitucional, $strDisciplinasPretendidas, $termoCompromisso) {
		if (Usuario::validaUsuario(false, $strEmail, $strConfirmaEmail, $strSenha, $strConfirmaSenha, $tipoCadastro, $strNome, $arquivoFoto, $intDataNascimento, $strSexo, $strCidade, $strEstado, $strInstituicao, $strNivel, $strCurso, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao, $strEnderecoInstitucional, $intTelefoneInstitucional, $strDisciplinasPretendidas, $termoCompromisso)) {
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * Verifica se o Email e a Senha inseridas sao validos e constam na base de dados.
	 * @return bool
	 * @param string $strEmail
	 * @param string $strSenha
	 */
	public static function logar($strEmail, $strSenha){
		if (validaEmail($strEmail) && validaSenha($strSenha)){
			$strQuery	=	'SELECT idUsuario FROM usuarios WHERE email="' . $strEmail . '" and senha=MD5("' . $strSenha . '");';
			if(!$resultado	=	BancoDados::query($strQuery)) {
				$_SESSION['constructore']['mensagens']['erroLogin']	=	'Email e/ou senha inválidos.';
				return false;
			}
			
			$idUsuario 	=	$resultado[0]['idUsuario'];
			
			$usuario	=	new Usuario($idUsuario);
			if($usuario->getIdUsuario()	==	null){
				$strMensagem	=	'Desculpe-nos. Não foi possivel estabelecer uma conexão com o Banco de dados.';
				$_SESSION['constructore']['mensagens']['erroLogin']	=	$strMensagem;
				return false;
			}
			
			$strQuery	=	'UPDATE usuarios SET ultimoAcesso = NOW() WHERE idUsuario=' . $idUsuario . ';';
			if (!BancoDados::query($strQuery)) {
				$strMensagem	=	'Desculpe-nos. Não foi possivel estabelecer uma conexão com o Banco de dados.';
				$_SESSION['constructore']['mensagens']['erroLogin']	=	$strMensagem;
				return false;
			}
			
			$_SESSION['constructore']['usuario']	=	serialize($usuario);
			/*$strMensagem	=	'Você está logado na Constructore.';
			$_SESSION['constructore']['mensagens']['msgLogin']	=	$strMensagem;*/
			return	true;
		}
		else{
			$strMensagem	=	'Email e/ou senha inválidos.';
			$_SESSION['constructore']['mensagens']['erroLogin']	=	$strMensagem;
			return false;	
		}
	}
	
	/**
	 * Apaga usuarios
	 * @return 
	 * @param object $idUsuario
	 */
	public static function apagar($idUsuario) {
		//TODO Apagar tudo que um usuario pode fazer junto com ele.
		//TODO Cascade
		
		$temFoto	=	false;
		$tipoUsuario=	"";
		$strQuery 	=	"SELECT foto, tipoCadastro FROM usuarios WHERE idUsuario = " . $idUsuario . ";";
		
		if ($resultado = BancoDados::query($strQuery)) {
			
			if ($resultado[0]['foto'] != '') {
				$caminhoFoto 	=	__CAMINHO_FOTO_USUARIO__ . $resultado[0]['foto'];
				$temFoto 		=	true;
			}
			
			if ($resultado[0]['tipoCadastro'] != '') {
				$tipoUsuario	=	$resultado[0]['tipoCadastro'];
			}
			else {
				return	false;
			}
			
			/*foreach ($resultado as $foto) {
				$caminhoFoto 	=	__CAMINHO_FOTO_USUARIO__ . $foto['foto'];
				print_r($resultado); die();
			}*/
			
			$strQuery 	=	"DELETE FROM usuariosTurmas WHERE idUsuario = " . $idUsuario . ";";
			
			if (BancoDados::query($strQuery)) {
				
				if ($tipoUsuario == 'aluno')
					$strQuery 	=	"DELETE FROM dadosAlunos WHERE idUsuario = " . $idUsuario . ";";
				else
					$strQuery 	=	"DELETE FROM dadosProfessores WHERE idUsuario = " . $idUsuario . ";";
				if (BancoDados::query($strQuery)) {
					$strQuery 	=	"DELETE FROM usuarios WHERE idUsuario = " . $idUsuario . ";";
					if (BancoDados::query($strQuery)) {
						if ($temFoto)
							unlink($caminhoFoto);
						return	true;
					}
					else {
						return	false;
					}
				}
				else {
					return false;
				}
			}
			else {
				return false;
			}
		}
		else {
			return	false;
		}
	}
	
	/**
	 * Autoriza novos professores da constructore.
	 * @return 
	 * @param object $idUsuario
	 */
	public static function autorizar($idUsuario) {
		$strQuery 	=	"UPDATE dadosProfessores SET autorizado = 1 WHERE idUsuario = " . $idUsuario . ";";
		
		return	BancoDados::query($strQuery);
	}
	
	/**
	 * Realiza uma busca simples (por nome e email) entre os usuarios da constructore.
	 * @return 
	 * @param object $filtro
	 * @param object $ordena
	 * @param object $ordem
	 * @param object $paginaAtual
	 * @param object $strBusca
	 */
	public static function buscaSimples($filtro, $ordena, $ordem, $paginaAtual, $strBusca) {
		
		$qtdAlunos 		=	0;
		$qtdProfessores	=	0;
		
		$strQuery		=	"SELECT COUNT(*) as qtdAlunos FROM dadosAlunos;";
		if($resultado	=	BancoDados::query($strQuery))	$qtdAlunos		=	$resultado[0]['qtdAlunos'];
		
		$strQuery		=	"SELECT COUNT(*) as qtdProfessores FROM dadosProfessores;";
		if($resultado	=	BancoDados::query($strQuery))	$qtdProfessores	=	$resultado[0]['qtdProfessores'];
		
		if ($qtdProfessores > 0 && $qtdAlunos > 0) {
			$dados		=	" usuarios.*, dadosAlunos.nivel, dadosAlunos.curso, dadosAlunos.periodo, dadosProfessores.autorizado, dadosProfessores.instituto, dadosProfessores.departamento, dadosProfessores.titulacao, dadosProfessores.enderecoInstitucional, dadosProfessores.telefoneInstitucional, dadosProfessores.cursosPretendidos";
			$tabelas 	=	" usuarios, dadosAlunos, dadosProfessores";
			$strWhere	=	" WHERE (usuarios.idUsuario = dadosAlunos.idUsuario OR usuarios.idUsuario = dadosProfessores.idUsuario)";
		}
		else {
			if ($qtdAlunos > 0) {
				$dados		=	" usuarios.*, dadosAlunos.nivel, dadosAlunos.curso, dadosAlunos.periodo";
				$tabelas 	=	" usuarios, dadosAlunos";
				$strWhere	=	" WHERE usuarios.idUsuario = dadosAlunos.idUsuario";
			}
			else {
				if ($qtdProfessores > 0) {
					$dados		=	" usuarios.*, dadosProfessores.autorizado, dadosProfessores.instituto, dadosProfessores.departamento, dadosProfessores.titulacao, dadosProfessores.enderecoInstitucional, dadosProfessores.telefoneInstitucional, dadosProfessores.cursosPretendidos";
					$tabelas 	=	" usuarios, dadosProfessores";
					$strWhere	=	" WHERE usuarios.idUsuario = dadosProfessores.idUsuario";					
				}
				else {
					return	array('listaUsuarios' => array(), 'qtdUsuarios' => 0, 'qtdPaginas' => 1);
				}
			}
		}
		
		$strQuery 		=	"SELECT" . $dados . " FROM" . $tabelas . $strWhere;
		
		switch ($filtro) {
			case "todos":
				break;
			
			case "professores":
				$strQuery 		.=	" AND usuarios.tipoCadastro = 'professor'";
				break;
				
			case "alunos":
				$strQuery 		.=	" AND usuarios.tipoCadastro = 'aluno'";
				break;
				
			case "novosprofessores":
				$strQuery 		.=	" AND usuarios.tipoCadastro = 'professor' AND dadosProfessores.autorizado = 0";
				break;
				
			case "busca":
				$palavrasBusca	=	explode('-', decodificaString($strBusca));
				foreach ($palavrasBusca as $chave => $palavraBusca) {
					$strQuery	=	"SELECT * FROM (" . $strQuery . ") as tabela" . $chave . " WHERE tabela" . $chave . ".nome REGEXP '.*" . $palavraBusca . ".*' OR tabela" . $chave . ".email REGEXP '.*" . $palavraBusca . ".*'";
				}
				break;
			
			default:
				redireciona(array("404"));
				exit;
				break;
		}
		
		switch ($ordena) {
			case 'ordenanome':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY nome " . $ordem;
				break;
				
			case 'ordenatipo':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY tipoCadastro " . $ordem;
				break;
				
			case 'ordenacadastro':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY dataCadastro " . $ordem;
				break;
			
			default:
				redireciona(array('404'));
				exit;
				break;
		}
		$strQueryQtd	=	"SELECT COUNT(*) as qtdUsuarios FROM (" . $strQuery . ") as tabelaContar;";
		$qtdUsuarios	=	BancoDados::query($strQueryQtd);
		
		$qtdUsuarios	=	$qtdUsuarios[0]['qtdUsuarios'];
		
		$qtdPaginas		=	ceil($qtdUsuarios / __QTD_ITENS_LISTA__);
		if ($qtdPaginas == 0) {
			$qtdPaginas 	=	1;
		}
		
		if ($paginaAtual == 0) {
			redireciona(array('404'));
			exit;
		}
		else {
			if ($paginaAtual > $qtdPaginas) {
				$paginaAtual 	=	$qtdPaginas;
			}
		}
		
		$strQuery 	.=	" LIMIT " . __QTD_ITENS_LISTA__ . " OFFSET " . (($paginaAtual - 1) * __QTD_ITENS_LISTA__) . ";";
		$listaUsuarios	=	BancoDados::query($strQuery);
		
		if (!is_array($listaUsuarios)) {
			redireciona(array($_SESSION['constructore']['URLOrigem']));
			exit;
		}
		return	array('listaUsuarios' => $listaUsuarios, 'qtdUsuarios' => $qtdUsuarios, 'qtdPaginas' => $qtdPaginas);
	}
	
	/**
	 * Realiza uma busca avancada pelos usuarios da constructore.
	 * @return 
	 * @param object $ordena
	 * @param object $ordem
	 * @param object $paginaAtual
	 * @param object $strNome
	 * @param object $strEmail
	 * @param object $comFoto
	 * @param object $strCursoConstructore
	 * @param object $strCursoGraduacao
	 * @param object $strInstituicao
	 * @param object $tipoCadastro
	 * @param object $dataCadastro1
	 * @param object $dataCadastro2
	 * @param object $ultimoLogin1
	 * @param object $ultimoLogin2
	 */
	public static function buscaAvancada ($ordena, $ordem, $paginaAtual, $strNome, $strEmail, $comFoto, $strSexo, $strEstado, $strCursoConstructore, $strInstituicao, $tipoCadastro, $dataCadastro1, $dataCadastro2, $ultimoLogin1, $ultimoLogin2, $strNivel, $strCursoGraduacao, $intPeriodo, $strInstituto, $strDepartamento, $strTitulacao) {
		
		if ($tipoCadastro == 'qualquer') {
			$qtdAlunos 		=	0;
			$qtdProfessores	=	0;
			
			$strQuery		=	"SELECT COUNT(*) as qtdAlunos FROM dadosAlunos;";
			if($resultado	=	BancoDados::query($strQuery))	$qtdAlunos		=	$resultado[0]['qtdAlunos'];
			
			$strQuery		=	"SELECT COUNT(*) as qtdProfessores FROM dadosProfessores;";
			if($resultado	=	BancoDados::query($strQuery))	$qtdProfessores	=	$resultado[0]['qtdProfessores'];
			
			if ($qtdProfessores > 0 && $qtdAlunos > 0) {
				$dados		=	" usuarios.*, dadosAlunos.nivel as nivel, dadosAlunos.curso as cursoGraduacao, dadosAlunos.periodo as periodo, dadosProfessores.autorizado as autorizado, dadosProfessores.instituto as instituto, dadosProfessores.departamento as departamento, dadosProfessores.titulacao as titulacao, dadosProfessores.enderecoInstitucional as enderecoInstitucional, dadosProfessores.telefoneInstitucional as telefoneInstitucional, dadosProfessores.cursosPretendidos as cursosPretendidos";
				$tabelas 	=	" usuarios, dadosAlunos, dadosProfessores";
				$strWhere	=	" WHERE (usuarios.idUsuario = dadosAlunos.idUsuario OR usuarios.idUsuario = dadosProfessores.idUsuario)";
			}
			else {
				if ($qtdAlunos > 0) {
					$dados		=	" usuarios.*, dadosAlunos.nivel as nivel, dadosAlunos.curso as cursoGraduacao, dadosAlunos.periodo as periodo";
					$tabelas 	=	" usuarios, dadosAlunos";
					$strWhere	=	" WHERE usuarios.idUsuario = dadosAlunos.idUsuario";
				}
				else {
					if ($tipoCadastro == "aluno") {
						return	array('listaUsuarios' => array(), 'qtdUsuarios' => 0, 'qtdPaginas' => 1);
					}
					else {
						if ($qtdProfessores > 0) {
							$dados		=	" usuarios.*, dadosProfessores.autorizado as autorizado, dadosProfessores.instituto as instituto, dadosProfessores.departamento as departamento, dadosProfessores.titulacao as titulacao, dadosProfessores.enderecoInstitucional as enderecoInstitucional, dadosProfessores.telefoneInstitucional as telefoneInstitucional, dadosProfessores.cursosPretendidos as cursosPretendidos";
							$tabelas 	=	" usuarios, dadosProfessores";
							$strWhere	=	" WHERE usuarios.idUsuario = dadosProfessores.idUsuario";					
						}
						else {
							return	array('listaUsuarios' => array(), 'qtdUsuarios' => 0, 'qtdPaginas' => 1);
						}
					}
				}
			}
		}
		else {
			if ($tipoCadastro == 'aluno') {
				$dados		=	" usuarios.*, dadosAlunos.nivel as nivel, dadosAlunos.curso as cursoGraduacao, dadosAlunos.periodo as periodo";
				$tabelas 	=	" usuarios, dadosAlunos";
				$strWhere	=	" WHERE usuarios.idUsuario = dadosAlunos.idUsuario";
			}
			else {
				$dados		=	" usuarios.*, dadosProfessores.autorizado as autorizado, dadosProfessores.instituto as instituto, dadosProfessores.departamento as departamento, dadosProfessores.titulacao as titulacao, dadosProfessores.enderecoInstitucional as enderecoInstitucional, dadosProfessores.telefoneInstitucional as telefoneInstitucional, dadosProfessores.cursosPretendidos as cursosPretendidos";
				$tabelas 	=	" usuarios, dadosProfessores";
				$strWhere	=	" WHERE usuarios.idUsuario = dadosProfessores.idUsuario";
			}
		}
		
		/*
		 * A Query so seleciona os dados do curso se for pesquisado por usuarios de um curso.
		 */
		
		/*if ($strCursoConstructore != '') {
			$strQuery 		=	"SELECT usuarios.*, dadosAlunos.nivel as nivel, dadosAlunos.curso as cursoGraduacao, dadosAlunos.periodo as periodo, dadosProfessores.autorizado as autorizado, dadosProfessores.instituto as instituto, dadosProfessores.departamento as departamento, dadosProfessores.titulacao as titulacao, dadosProfessores.enderecoInstitucional as enderecoInstitucional, dadosProfessores.telefoneInstitucional as telefoneInstitucional, dadosProfessores.cursosPretendidos as cursosPretendidos, cursos.nome as nomeCurso FROM usuarios, dadosAlunos, dadosProfessores, usuariosCursos, cursos WHERE (usuarios.idUsuario = dadosAlunos.idUsuario OR usuarios.idUsuario = dadosProfessores.idUsuario) AND usuarios.idUsuario = usuariosCursos.idUsuario AND cursos.idCurso = usuariosCursos.idCurso AND ";
		}
		else {
			$strQuery 		=	"SELECT usuarios.*, dadosAlunos.nivel as nivel, dadosAlunos.curso as cursoGraduacao, dadosAlunos.periodo as periodo, dadosProfessores.autorizado as autorizado, dadosProfessores.instituto as instituto, dadosProfessores.departamento as departamento, dadosProfessores.titulacao as titulacao, dadosProfessores.enderecoInstitucional as enderecoInstitucional, dadosProfessores.telefoneInstitucional as telefoneInstitucional, dadosProfessores.cursosPretendidos as cursosPretendidos FROM usuarios, dadosAlunos, dadosProfessores WHERE (usuarios.idUsuario = dadosAlunos.idUsuario OR usuarios.idUsuario = dadosProfessores.idUsuario) AND ";
		}*/
		
		if ($strCursoConstructore != '') {
			$strQuery	=	"SELECT" . $dados . ", cursos.nome as nomeCurso FROM" . $tabelas . ", usuariosTurmas, turmas, cursos" . $strWhere . " AND usuarios.idUsuario = usuariosTurmas.idUsuario AND usuariosTurmas.idTurma = turmas.idTurma AND turmas.idCurso = cursos.idCurso AND ";
		}
		else {
			$strQuery	=	"SELECT" . $dados . " FROM" . $tabelas . $strWhere . " AND ";
		}
		
		switch($tipoCadastro) {		
			case 'aluno':
				$strQuery	.=	"tipoCadastro = 'aluno' AND ";
				break;
				
			case 'professor':
				$strQuery	.=	"tipoCadastro = 'professor' AND ";
				break;
			
			case 'novoprofessor':
				$strQuery	.=	"tipoCadastro = 'professor' AND dadosProfessores.autorizado=0 AND ";
				break;
			
			case 'administrador':
				$strQuery	.=	"tipoCadastro = 'administrador' AND ";
				break;
				
			default:
				break;
		}
		
		if ($comFoto == 'true') {
			$strQuery	.=	"usuarios.foto != '' AND ";
		}
		
		if ($strSexo != '') {
			$strQuery	.=	"usuarios.sexo = '" . $strSexo . "' AND ";
		}
		
		if ($strEstado != '') {
			$strQuery	.=	"usuarios.estado = '" . $strEstado . "' AND ";
		}
		
		if ($dataCadastro1 != '') {
			$strQuery	.=	"usuarios.dataCadastro >= '" . $dataCadastro1 . "' AND ";
		}
		
		if ($dataCadastro2 != '') {
			$strQuery	.=	"usuarios.dataCadastro <= '" . $dataCadastro2 . " 23:59:59' AND ";
		}
		
		if ($ultimoLogin1 != '') {
			$strQuery	.=	"usuarios.ultimoAcesso >= '" . $ultimoLogin1 . "' AND ";
		}
		
		if ($ultimoLogin2 != '') {
			$strQuery	.=	"usuarios.ultimoAcesso <= '" . $ultimoLogin2 . " 23:59:59' AND ";
		}
		
		if ($strNivel != '' && $tipoCadastro == 'aluno') {
			$strQuery	.=	"dadosAlunos.nivel = '" . $strNivel . "' AND ";
		}
		
		if ($intPeriodo != '' && $tipoCadastro == 'aluno') {
			$strQuery	.=	"dadosAlunos.periodo = '" . $intPeriodo . "' AND ";
		}
		
		if ($strTitulacao != '' && $tipoCadastro != 'aluno' && $tipoCadastro != 'qualquer') {
			$strQuery	.=	"dadosProfessores.titulacao = '" . $strTitulacao . "' AND ";
		}
		
		$strQuery	=	preg_replace('/ AND $/', '', $strQuery);
		$strQuery	=	preg_replace('/ WHERE $/', '', $strQuery);
		
		$tabela		=	0;
		
		$strQueryFrente 	=	'SELECT * FROM (';
		
		if ($strNome != '') {
			$palavrasBusca 	=	explode('-', decodificaString($strNome));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".nome REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strEmail != '') {
			$palavrasBusca 	=	explode('-', decodificaString($strEmail));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".email REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strInstituicao != '') {
			$palavrasBusca 	=	explode('-', decodificaString($strInstituicao));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".instituicao REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strCursoGraduacao != '' && $tipoCadastro == 'aluno') {
			$palavrasBusca 	=	explode('-', decodificaString($strCursoGraduacao));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".cursoGraduacao REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strInstituto != '' && $tipoCadastro != 'aluno' && $tipoCadastro != 'qualquer') {
			$palavrasBusca 	=	explode('-', decodificaString($strInstituto));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".instituto REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strDepartamento != '' && $tipoCadastro != 'aluno' && $tipoCadastro != 'qualquer') {
			$palavrasBusca 	=	explode('-', decodificaString($strDepartamento));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE tabela" . $tabela . ".departamento REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		if ($strCursoConstructore != '') {
			$palavrasBusca 	=	explode('-', decodificaString($strCursoConstructore));
			foreach ($palavrasBusca as $palavraBusca) {
				$strQuery	=	$strQueryFrente . $strQuery . ") as tabela" . $tabela . " WHERE nomeCurso REGEXP '.*" . $palavraBusca . ".*'";
				$tabela++;
			}
		}
		
		switch ($ordena) {
			case 'ordenanome':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY nome " . $ordem;
				break;
				
			case 'ordenatipo':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY tipoCadastro " . $ordem;
				break;
				
			case 'ordenacadastro':
				$strQuery 		.=	" GROUP BY idUsuario ORDER BY dataCadastro " . $ordem;
				break;
			
			default:
				redireciona(array('404'));
				exit;
				break;
		}
		$strQueryQtd	=	'SELECT COUNT(*) as qtdUsuarios FROM (' . $strQuery . ') as tabela' . $tabela . ';';
		
		$qtdUsuarios	=	BancoDados::query($strQueryQtd);
		
		$qtdUsuarios	=	$qtdUsuarios[0]['qtdUsuarios'];
		
		$qtdPaginas		=	ceil($qtdUsuarios / __QTD_ITENS_LISTA__);
		if ($qtdPaginas == 0) {
			$qtdPaginas 	=	1;
		}
		
		if ($paginaAtual == 0 || $paginaAtual > $qtdPaginas) {
			redireciona(array('404'));
			exit;
		}
		
		$strQuery 	.=	" LIMIT " . __QTD_ITENS_LISTA__ . " OFFSET " . (($paginaAtual - 1) * __QTD_ITENS_LISTA__) . ";";
		
		$strQuery	=	$strQuery;
		$listaUsuarios	=	BancoDados::query($strQuery);
		
		if (!is_array($listaUsuarios)) {
			redireciona(array($_SESSION['constructore']['URLOrigem']));
			exit;
		}
		
		return	array('listaUsuarios' => $listaUsuarios, 'qtdUsuarios' => $qtdUsuarios, 'qtdPaginas' => $qtdPaginas);
	}
}
?>